package com.easydl.project.kafka.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

import com.easydl.project.amqp.model.EasydlDiscernMessageVO;

/**
 * 1)kafka producer发送消息的时候，可以指定key，这个key的作用是为消息选择存储分区，key可以为空，
 * 	当指定key且不为空的时候，kafka是根据key的hash值与分区数取模来决定数据存储到那个分区
 * 
 * 2)Kafka的ack机制
 * Kafka的ack机制，指的是producer的消息发送确认机制，这直接影响到Kafka集群的吞吐量和消息可靠性。
 * 
 * ack有3个可选值，分别是1，0，-1。
 * ack=1，简单来说就是，producer只要收到一个分区副本成功写入的通知就认为推送消息成功了。这里有一个地方需要注意，这个副本必须是leader副本。
 * 只有leader副本成功写入了，producer才会认为消息发送成功。
 * 注意，ack的默认值就是1。这个默认值其实就是吞吐量与可靠性的一个折中方案。生产上我们可以根据实际情况进行调整，比如如果你要追求高吞吐量，那么就要放弃可靠性。
 * ack=0，简单来说就是，producer发送一次就不再发送了，不管是否发送成功。
 * ack=-1，简单来说就是，producer只有收到分区内所有副本的成功写入的通知才认为推送消息成功了。
 * 链接：https://www.jianshu.com/p/c98b934f2c2b
 * @author fxb208
 *
 */
@Service
public class EasydlKafkaService {
	
	@Autowired
	private KafkaTemplate<String, Object> kafkaTemplate;
	
	public void sendEasydlDiscernMessage(EasydlDiscernMessageVO easydlDiscernMessageVO) {
		kafkaTemplate.send("easydlDiscern", null, easydlDiscernMessageVO);
	}
}
